home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Audio, Video & Photo / Songbird 0.7.0 / Songbird_0.7.0_windows-i686-msvc8.exe / components / sbDeviceServicePaneService.js < prev    next >
Text File  |  2008-08-06  |  10KB  |  363 lines

  1. /** vim: ts=2 sw=2 expandtab
  2. //
  3. // BEGIN SONGBIRD GPL
  4. //
  5. // This file is part of the Songbird web player.
  6. //
  7. // Copyright(c) 2005-2008 POTI, Inc.
  8. // http://songbirdnest.com
  9. //
  10. // This file may be licensed under the terms of of the
  11. // GNU General Public License Version 2 (the "GPL").
  12. //
  13. // Software distributed under the License is distributed
  14. // on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
  15. // express or implied. See the GPL for the specific language
  16. // governing rights and limitations.
  17. //
  18. // You should have received a copy of the GPL along with this
  19. // program. If not, go to http://www.gnu.org/licenses/gpl.html
  20. // or write to the Free Software Foundation, Inc.,
  21. // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  22. //
  23. // END SONGBIRD GPL
  24. //
  25.  */
  26.  
  27. /**
  28.  * \file sbDeviceServicePane.js
  29.  */
  30.  
  31. const Cc = Components.classes;
  32. const Ci = Components.interfaces;
  33. const Cr = Components.results;
  34. const Cu = Components.utils;
  35.  
  36. const CONTRACTID = "@songbirdnest.com/servicepane/device;1";
  37.  
  38. const NC='http://home.netscape.com/NC-rdf#';
  39. const SP = "http://songbirdnest.com/rdf/servicepane#";
  40. const DEVICESP_NS = "http://songbirdnest.com/rdf/device-servicepane#";
  41.  
  42. const URN_PREFIX_DEVICE = "urn:device:";
  43. const DEVICE_NODE_WEIGHT = -2
  44.  
  45. Cu.import("resource://app/jsmodules/DOMUtils.jsm");
  46.  
  47. /**
  48.  * Given the arguments var of a function, dump the
  49.  * name of the function and the parameters provided
  50.  */
  51. function logcall(parentArgs) {
  52.   dump("\n");
  53.   dump(parentArgs.callee.name + "(");
  54.   for (var i = 0; i < parentArgs.length; i++) {
  55.     dump(parentArgs[i]);
  56.     if (i < parentArgs.length - 1) {
  57.       dump(', ');
  58.     }
  59.   }
  60.   dump(")\n");
  61. }
  62.  
  63.  
  64.  
  65. /**
  66.  * /class sbDeviceServicePane
  67.  * /brief Provides device related nodes for the service pane
  68.  * \sa sbIServicePaneService sbIDeviceServicePaneService
  69.  */
  70. function sbDeviceServicePane() {
  71.   this._servicePane = null;
  72.  
  73.   // use the default stringbundle to translate tree nodes
  74.   this.stringbundle = null;
  75. }
  76. sbDeviceServicePane.prototype.QueryInterface =
  77. function sbDeviceServicePane_QueryInterface(iid) {
  78.   if (!iid.equals(Ci.nsISupports) &&
  79.     !iid.equals(Ci.sbIServicePaneModule) &&
  80.     !iid.equals(Ci.sbIDeviceServicePaneService)) {
  81.     throw Components.results.NS_ERROR_NO_INTERFACE;
  82.   }
  83.   return this;
  84. }
  85.  
  86.  
  87. //////////////////////////
  88. // sbIServicePaneModule //
  89. //////////////////////////
  90.  
  91. sbDeviceServicePane.prototype.servicePaneInit =
  92. function sbDeviceServicePane_servicePaneInit(sps) {
  93.   //logcall(arguments);
  94.  
  95.   // keep track of the service pane service
  96.   this._servicePane = sps;
  97.  
  98.   // load the device context menu document
  99.   this._deviceContextMenuDoc =
  100.         DOMUtils.loadDocument
  101.           ("chrome://songbird/content/xul/device/deviceContextMenu.xul");
  102. }
  103.  
  104. sbDeviceServicePane.prototype.shutdown =
  105. function sbDeviceServicePane_shutdown() {
  106.   // release object references
  107.   this._servicePane = null;
  108.   this._deviceContextMenuDoc = null;
  109. }
  110.  
  111. sbDeviceServicePane.prototype.fillContextMenu =
  112. function sbDeviceServicePane_fillContextMenu(aNode, aContextMenu, aParentWindow) {
  113.   // Get the node device ID.  Do nothing if not a device node.
  114.   var deviceID = aNode.getAttributeNS(DEVICESP_NS, "device-id");
  115.   if (!deviceID)
  116.     return;
  117.  
  118.   // Do nothing if not set to fill with the default device context menu items.
  119.   var fillDefaultContextMenu = aNode.getAttributeNS(DEVICESP_NS,
  120.                                                     "fillDefaultContextMenu");
  121.   if (fillDefaultContextMenu != "true")
  122.     return;
  123.  
  124.   // Import device context menu items into the context menu.
  125.   DOMUtils.importChildElements(aContextMenu,
  126.                                this._deviceContextMenuDoc,
  127.                                "device_context_menu_items",
  128.                                { "device-id": deviceID });
  129. }
  130.  
  131. sbDeviceServicePane.prototype.fillNewItemMenu =
  132. function sbDeviceServicePane_fillNewItemMenu(aNode, aContextMenu, aParentWindow) {
  133. }
  134.  
  135. sbDeviceServicePane.prototype.onSelectionChanged =
  136. function sbDeviceServicePane_onSelectionChanged(aNode, aContainer, aParentWindow) {
  137. }
  138.  
  139. sbDeviceServicePane.prototype.canDrop =
  140. function sbDeviceServicePane_canDrop(aNode, aDragSession, aOrientation, aWindow) {
  141.   return false;
  142. }
  143.  
  144. sbDeviceServicePane.prototype.onDrop =
  145. function sbDeviceServicePane_onDrop(aNode, aDragSession, aOrientation, aWindow) {
  146. }
  147.  
  148. sbDeviceServicePane.prototype.onDragGesture =
  149. function sbDeviceServicePane_onDragGesture(aNode, aTransferable) {
  150.   return false;
  151. }
  152.  
  153.  
  154. /**
  155.  * Called when the user has attempted to rename a library/medialist node
  156.  */
  157. sbDeviceServicePane.prototype.onRename =
  158. function sbDeviceServicePane_onRename(aNode, aNewName) {
  159. }
  160.  
  161.  
  162. //////////////////////////////////
  163. // sbIDeviceServicePaneService //
  164. //////////////////////////////////
  165.  
  166. sbDeviceServicePane.prototype.createNodeForDevice =
  167. function sbDeviceServicePane_createNodeForDevice(aDevice, aDeviceIdentifier) {
  168.   //logcall(arguments);
  169.  
  170.   // Get the Node.
  171.   var id = this._deviceURN(aDevice, aDeviceIdentifier);
  172.   var node = this._servicePane.getNode(id);
  173.   if (!node) {
  174.     // Create the node
  175.     node = this._servicePane.addNode(id, this._servicePane.root, true);
  176.   }
  177.  
  178.   // Refresh the information just in case it is supposed to change
  179.   node.contractid = CONTRACTID;
  180.   node.setAttributeNS(SP, "Weight", DEVICE_NODE_WEIGHT);
  181.   node.contractid = CONTRACTID;
  182.   node.editable = false;
  183.  
  184.   // Sort node into position.
  185.   this._servicePane.sortNode(node);
  186.  
  187.   return node;
  188. }
  189.  
  190. sbDeviceServicePane.prototype.createNodeForDevice2 =
  191. function sbDeviceServicePane_createNodeForDevice2(aDevice) {
  192.   // Get the Node.
  193.   var id = this._deviceURN2(aDevice);
  194.   
  195.   var node = this._servicePane.getNode(id);
  196.   if (!node) {
  197.     // Create the node
  198.     node = this._servicePane.addNode(id, this._servicePane.root, true);
  199.   }
  200.  
  201.   // Refresh the information just in case it is supposed to change
  202.   node.contractid = CONTRACTID;
  203.   node.setAttributeNS(DEVICESP_NS, "device-id", aDevice.id);
  204.   node.setAttributeNS(SP, "Weight", DEVICE_NODE_WEIGHT);
  205.   node.contractid = CONTRACTID;
  206.   node.editable = false;
  207.   node.properties = "device";
  208.  
  209.   try {
  210.     var iconUri = aDevice.properties.iconUri;
  211.     if (iconUri) {
  212.       var spec = iconUri.spec;
  213.       if (iconUri.schemeIs("file") && /\.ico$/i(spec)) {
  214.         // for *.ico, try to get the small icon
  215.         spec = "moz-icon://" + spec + "?size=16";
  216.       }
  217.       node.image = spec;
  218.     }
  219.   } catch(ex) {
  220.     /* we do not care if setting the icon fails */
  221.   }
  222.  
  223.   // Sort node into position.
  224.   this._servicePane.sortNode(node);
  225.  
  226.   return node;
  227. }
  228.  
  229. sbDeviceServicePane.prototype.getNodeForDevice =
  230. function sbDeviceServicePane_getNodeForDevice(aDevice) {
  231.   // Get the Node.
  232.   var id = this._deviceURN2(aDevice);
  233.   return this._servicePane.getNode(id);
  234. }
  235.  
  236. sbDeviceServicePane.prototype.setFillDefaultContextMenu =
  237. function sbDeviceServicePane_setFillDefaultContxtMenu(aNode,
  238.                                                       aEnabled) {
  239.   if (aEnabled) {
  240.     aNode.setAttributeNS("http://songbirdnest.com/rdf/device-servicepane#",
  241.                          "fillDefaultContextMenu",
  242.                          "true");
  243.   } else {
  244.     aNode.setAttributeNS("http://songbirdnest.com/rdf/device-servicepane#",
  245.                          "fillDefaultContextMenu",
  246.                          "false");
  247.   }
  248. }
  249.  
  250. /////////////////////
  251. // Private Methods //
  252. /////////////////////
  253.  
  254. /**
  255.  * Get a service pane identifier for the given device
  256.  */
  257. sbDeviceServicePane.prototype._deviceURN =
  258. function sbDeviceServicePane__deviceURN(aDevice, aDeviceIdentifier) {
  259.   return URN_PREFIX_DEVICE + aDevice.deviceCategory + ":" + aDeviceIdentifier;
  260. }
  261.  
  262. sbDeviceServicePane.prototype._deviceURN2 =
  263. function sbDeviceServicePane__deviceURN2(aDevice) {
  264.   var id = "" + aDevice.id;
  265.   
  266.   if(id.charAt(0) == "{" &&
  267.      id.charAt(-1) == "}") {
  268.     id = id.substring(1, -1);
  269.   }
  270.   
  271.   
  272.   return URN_PREFIX_DEVICE + id;
  273. }
  274.  
  275. ///////////
  276. // XPCOM //
  277. ///////////
  278.  
  279. /**
  280.  * /brief XPCOM initialization code
  281.  */
  282. function makeGetModule(CONSTRUCTOR, CID, CLASSNAME, CONTRACTID, CATEGORIES) {
  283.   return function (comMgr, fileSpec) {
  284.     return {
  285.       registerSelf : function (compMgr, fileSpec, location, type) {
  286.         compMgr.QueryInterface(Ci.nsIComponentRegistrar);
  287.         compMgr.registerFactoryLocation(CID,
  288.                         CLASSNAME,
  289.                         CONTRACTID,
  290.                         fileSpec,
  291.                         location,
  292.                         type);
  293.         if (CATEGORIES && CATEGORIES.length) {
  294.           var catman =  Cc["@mozilla.org/categorymanager;1"]
  295.               .getService(Ci.nsICategoryManager);
  296.           for (var i=0; i<CATEGORIES.length; i++) {
  297.             var e = CATEGORIES[i];
  298.             catman.addCategoryEntry(e.category, e.entry, e.value,
  299.               true, true);
  300.           }
  301.         }
  302.       },
  303.  
  304.       getClassObject : function (compMgr, cid, iid) {
  305.         if (!cid.equals(CID)) {
  306.           throw Cr.NS_ERROR_NO_INTERFACE;
  307.         }
  308.  
  309.         if (!iid.equals(Ci.nsIFactory)) {
  310.           throw Cr.NS_ERROR_NOT_IMPLEMENTED;
  311.         }
  312.  
  313.         return this._factory;
  314.       },
  315.  
  316.       _factory : {
  317.         createInstance : function (outer, iid) {
  318.           if (outer != null) {
  319.             throw Cr.NS_ERROR_NO_AGGREGATION;
  320.           }
  321.           return (new CONSTRUCTOR()).QueryInterface(iid);
  322.         }
  323.       },
  324.  
  325.       unregisterSelf : function (compMgr, location, type) {
  326.         compMgr.QueryInterface(Ci.nsIComponentRegistrar);
  327.         compMgr.unregisterFactoryLocation(CID, location);
  328.         if (CATEGORIES && CATEGORIES.length) {
  329.           var catman =  Cc["@mozilla.org/categorymanager;1"]
  330.               .getService(Ci.nsICategoryManager);
  331.           for (var i=0; i<CATEGORIES.length; i++) {
  332.             var e = CATEGORIES[i];
  333.             catman.deleteCategoryEntry(e.category, e.entry, true);
  334.           }
  335.         }
  336.       },
  337.  
  338.       canUnload : function (compMgr) {
  339.         return true;
  340.       },
  341.  
  342.       QueryInterface : function (iid) {
  343.         if ( !iid.equals(Ci.nsIModule) ||
  344.              !iid.equals(Ci.nsISupports) )
  345.           throw Cr.NS_ERROR_NO_INTERFACE;
  346.         return this;
  347.       }
  348.  
  349.     };
  350.   }
  351. }
  352.  
  353. var NSGetModule = makeGetModule (
  354.   sbDeviceServicePane,
  355.   Components.ID("{845c31ee-c30e-4fb6-9667-0b10e58c7069}"),
  356.   "Songbird Device Service Pane Service",
  357.   CONTRACTID,
  358.   [{
  359.     category: 'service-pane',
  360.     entry: 'device', // we want this to load first
  361.     value: CONTRACTID
  362.   }]);
  363.